package jp.co.dailyReport.dailyReport.action;

import java.io.IOException;
import java.util.Vector;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import jp.co.dailyReport.DataUnavailableException;
import jp.co.dailyReport.dailyReport.DailyReportWorkItem;
import jp.co.dailyReport.staff.Staff;
import jp.co.dailyReport.project.PjStaff;
import jp.co.dailyReport.project.PjStaffManager;
import jp.co.dailyReport.project.Project;
import jp.co.dailyReport.project.ProjectManager;
import jp.co.dailyReport.workItem.WorkItem;
import jp.co.dailyReport.workItem.WorkItemManager;

/**
 * 日報登録の作業項目追加ページのボタン（追加、削除、↑、↓）
 * が押されたときの処理を管理するクラスです。
 */
public class DailyReportWorkItemAction extends Action {

	private static Logger log = Logger.getLogger(DailyReportWorkItemAction.class);

	/**
	 * 日報登録の作業項目追加ページのボタン（追加、削除、↑、↓）が押されたときの処理を実行します。<BR>
	 * 社員IDからプロジェクト参加社員情報を取得した後、プロジェクトIDからプロジェクト情報を取得します。<BR><BR>
	 * 
	 * 「追加」ボタンが押された場合の処理：<BR>
	 * 入力チェックを行います。<BR>
	 * WorkItemインスタンスを生成し、フィールドに追加された作業項目情報をセットし、セッションに設定します。<BR>
	 * DailyReportWorkItemインスタンスを生成し、フィールドに追加された日報作業項目情報をセットし、セッションに設定します。<BR><BR>
	 * 「削除」ボタンが押された場合の処理：<BR>
	 * セッションから作業項目情報を取得して、削除されなかったWorkItemオブジェクトをセッションに設定します。<BR>
	 * セッションから日報作業項目情報を取得して、削除されなかった作業項目の作業項目IDと同じ作業項目IDフィールド値を<BR>
	 * もつDailyReportWorkItemオブジェクトをセッションに設定します。<BR><BR>
	 * 「↑」ボタンが押された場合の処理：<BR>
	 * セッションから作業項目情報を取得して、選択されたWorkItemオブジェクトの表示順位と<BR>
	 * それより1大きい表示順位のWorkItemオブジェクトをいれかえてセッションに設定します。<BR><BR>
	 * 「↓」ボタンが押された場合の処理：<BR>
	 * セッションから作業項目情報を取得して、選択されたWorkItemオブジェクトの表示順位と<BR>
	 * それより1小さい表示順位のWorkItemオブジェクトをいれかえてセッションに設定します。
	 * 
	 * @param mapping このインスタンスを選択するために使用したActionMapping
	 * @param form 存在するならば、このリクエストのためのActionForm Bean
	 * @param request 処理しているHTTPリクエスト
	 * @param response 処理しているHTTPレスポンス
	 * @return ActionForwardインスタンス
	 * @throws IOException, ServletException
	 */
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        log.debug("DailyReportWorkItemAction start");

		HttpSession session = request.getSession();
		log.debug("session.getId() = " + session.getId());
		Staff staff = (Staff)session.getAttribute("LoginStaff");
		Vector projectList = new Vector();
		try {
			PjStaff pjStaff[] = PjStaffManager.getProjectId(staff.getStaffId());
			for(int i = 0; i < pjStaff.length; i++) {
				if(ProjectManager.isExist(pjStaff[i].getProjectId())){
					//プロジェクトの終了ﾁｪｯｸ
					if(!ProjectManager.load(pjStaff[i].getProjectId()).isStatusFlg()){
						Project project = ProjectManager.load(pjStaff[i].getProjectId());
						projectList.add(project);
					}
				}
			}
		} catch(DataUnavailableException due) {
			log.error(due.getMessage());
		}
		request.setAttribute("projectList", projectList);

		if(request.getParameter("add") != null) {
			DynaActionForm workItemActionForm = (DynaActionForm)form;
			ActionErrors errors = new ActionErrors();
			String name = ((String)workItemActionForm.get("name")).trim();
			if (name == null || name.length() == 0){
				errors.add("workItemName",new ActionError("errors.workItemName.required"));
			}
			if (!errors.isEmpty()){
				saveErrors(request,errors);
			}else{
				workItemAdd(form, request);
			}
		} else if(request.getParameter("rm") != null) {
			workItemRm(form, request);
		}

		Vector pjWorkItemList = (Vector)session.getAttribute("pjWorkItemList");
		WorkItem[] workItem = (WorkItem[])pjWorkItemList.toArray(new WorkItem[0]);
		for(int i=0;i<workItem.length;i++){
			if(request.getParameter("workItemUp[" + i + "]") != null) {
				workItemUp(request,i);
			} else if(request.getParameter("workItemDown[" + i + "]") != null) {
				workItemDown(request,i);
			}
		}

        log.debug("DailyReportWorkItemAction end");
        return mapping.findForward("success");
    }

	private void workItemAdd(ActionForm form, HttpServletRequest request) {

		HttpSession session = request.getSession();
		DynaActionForm workItemActionForm = (DynaActionForm)form;
		Vector pjWorkItemList = (Vector)session.getAttribute("pjWorkItemList");
		Vector pjDailyReportWorkItemList = (Vector)session.getAttribute("pjDailyReportWorkItemList");
		int i = pjWorkItemList.size();

		WorkItem workItem = new WorkItem();
		workItem.setProjectId(((Integer)workItemActionForm.get("projectId")).intValue());
		workItem.setName((String)workItemActionForm.get("name"));
		workItem.setDisplayNm(i);
		workItem.setAddStaffId(((Integer)workItemActionForm.get("addStaffId")).intValue());
		pjWorkItemList.add(workItem);
		session.setAttribute("pjWorkItemList", pjWorkItemList);

		DailyReportWorkItem dailyReportWorkItem = new DailyReportWorkItem();
		dailyReportWorkItem.setWorkItemId(0);
		dailyReportWorkItem.setWorkingHours(0.0D);
		dailyReportWorkItem.setCompleteness(0);
		pjDailyReportWorkItemList.add(dailyReportWorkItem);
	}

	private void workItemRm(ActionForm form, HttpServletRequest request) {

		HttpSession session = request.getSession();
		Vector beforePjWorkItemList = (Vector)session.getAttribute("pjWorkItemList");
		Vector afterPjWorkItemList = new Vector();
		WorkItem[] workItem = (WorkItem[])beforePjWorkItemList.toArray(new WorkItem[0]);
		Vector beforePjDailyReportWorkItemList = (Vector)session.getAttribute("pjDailyReportWorkItemList");
		Vector afterPjDailyReportWorkItemList = new Vector();
		DailyReportWorkItem[] dailyReportWorkItem = (DailyReportWorkItem[])beforePjDailyReportWorkItemList.toArray(new DailyReportWorkItem[0]);
		int j = 0;

		for(int i=0;i<workItem.length;i++){
			if(request.getParameter("pjWorkItemList[" + i + "].displayNm")==null) {
				workItem[i].setDisplayNm(j);
				afterPjWorkItemList.add(workItem[i]);
				afterPjDailyReportWorkItemList.add(dailyReportWorkItem[i]);
				j++;
			}
		}
		session.setAttribute("pjWorkItemList", afterPjWorkItemList);
		session.setAttribute("pjDailyReportWorkItemList", afterPjDailyReportWorkItemList);
	}

	private void workItemUp(HttpServletRequest request, int displayNm) {

		HttpSession session = request.getSession();
		Vector pjWorkItemList = (Vector)session.getAttribute("pjWorkItemList");
		try {
			pjWorkItemList = WorkItemManager.getUpWorkItem(displayNm,pjWorkItemList);
			session.setAttribute("pjWorkItemList", pjWorkItemList);
		} catch(DataUnavailableException due) {
			log.error(due.getMessage());
		}
	}

	private void workItemDown(HttpServletRequest request, int displayNm) {

		HttpSession session = request.getSession();
		Vector pjWorkItemList = (Vector)session.getAttribute("pjWorkItemList");

		try {
			pjWorkItemList = WorkItemManager.getDownWorkItem(displayNm,pjWorkItemList);
			session.setAttribute("pjWorkItemList", pjWorkItemList);
		} catch(DataUnavailableException due) {
			log.error(due.getMessage());
		}
	}

}
